package com.zuikaku.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class JDBCUtil {
    //数据库连接信息
    private static String URL;
    private static String user;
    private static String pwd;
    //连接池相关配置
    private static List<Connection> availableConnectionList=new ArrayList<Connection>();//可用连接的列表
    private static final int maxConnections=5;


    /**
     * 初始化连接池
     */
    public static void init()
    {
        ResourceBundle rb = ResourceBundle.getBundle("db");
        URL = rb.getString("jdbc.url");
        user = rb.getString("jdbc.dbuser");
        pwd =rb.getString("jdbc.password");


        //创建多个连接并加入到可用列表中
        for(int i=1;i<=maxConnections;i++)
        {
            Connection connection= creatConnection();
            availableConnectionList.add(connection);//刚刚创建出来时，所有连接都是可用的，所以全部加入可用列表
        }
        System.out.println("连接池初始化成功,可用连接数为"+availableConnectionList.size());


    }


    /**
     * 用于外界得到连接
     */
    public static Connection getConnection()
    {
        if(!availableConnectionList.isEmpty())
        {
            //不为空，说明有可用的连接，随便取得一个，就取第一个
            Connection connection=availableConnectionList.get(0);
            //这个被取走之后，就不可用了，要将其从可用列表中移除
            availableConnectionList.remove(connection);
            return connection;
        }else{
            //说明可用连接不够了，需要创建新的连接
            Connection extraConnection=creatConnection();
            return extraConnection;
        }
    }


    /**
     * 用于外界释放连接，归还连接，该连接可用（非关闭）
     * @param conn
     */
    public static void releaseConnection(Connection conn)
    {
        //放回加入到可用列表
        availableConnectionList.add(conn);
    }


    /**
     * 关闭所有连接，不再可用，程序退出前使用
     */
    public static void closeAllConnection()
    {
        for(Connection connection:availableConnectionList)
        {
            try {
                connection.close();
            } catch (SQLException e) {
                System.out.println("关闭连接时发生异常"+e);
            }
        }
    }
    /**
     * 创建连接
     * @return
     */
    private static Connection creatConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection(URL, user, pwd);
            return connection;
        } catch (Exception e) {
            System.out.println("创建数据库连接发生异常" + e);
        }
        return null;
    }
}
